import cloudHelper from '../helpers/cloud/cloud_helper';
// 使用统一配置入口引用模型
const { DocumentModel } = require('../../config/models_config');
import SmartCache from '../../helpers/smart_cache';

// 创建文档缓存实例
const documentCache = new SmartCache('document', 10 * 60 * 1000); // 10分钟缓存

/**
 * 文档仓储层
 * 负责文档数据的持久化和检索
 */
class DocumentRepository {
  /**
   * 获取项目下的文档列表
   * @param {String} projectId 项目ID
   * @param {Object} params 查询参数
   */
  async getProjectDocuments(projectId, params = {}) {
    if (!projectId) throw new Error('项目ID不能为空');
    
    const cacheKey = `project:${projectId}:list:${JSON.stringify(params)}`;
    
    try {
      // 尝试从缓存获取
      return await documentCache.get(cacheKey, async () => {
        // 从云函数获取数据
        const result = await cloudHelper.callCloudData('document/list', {
          projectId,
          ...params
        });
        
        // 转换为领域模型
        if (result && result.list) {
          result.list = result.list.map(item => new DocumentModel(item));
        }
        
        return result;
      });
    } catch (err) {
      console.error('[DocumentRepository] getProjectDocuments 错误:', err);
      throw err;
    }
  }
  
  /**
   * 获取文档详情
   * @param {String} id 文档ID
   */
  async getDocumentById(id) {
    if (!id) throw new Error('文档ID不能为空');
    
    const cacheKey = `detail:${id}`;
    
    try {
      // 尝试从缓存获取
      return await documentCache.get(cacheKey, async () => {
        // 从云函数获取数据
        const result = await cloudHelper.callCloudData('document/detail', {id});
        
        // 转换为领域模型
        return result ? new DocumentModel(result) : null;
      });
    } catch (err) {
      console.error('[DocumentRepository] getDocumentById 错误:', err);
      throw err;
    }
  }
  
  /**
   * 上传文档
   * @param {DocumentModel} document 文档模型
   * @param {String} tempFilePath 临时文件路径
   */
  async uploadDocument(document, tempFilePath) {
    try {
      // 验证文档数据
      const validation = document.validate();
      if (!validation.valid) {
        throw new Error('文档数据验证失败: ' + JSON.stringify(validation.errors));
      }
      
      if (!tempFilePath) {
        throw new Error('临时文件路径不能为空');
      }
      
      // 上传文件至云存储
      const fileResult = await cloudHelper.uploadFile(tempFilePath, 'document');
      
      // 设置文件信息
      document.fileId = fileResult.fileID;
      document.fileUrl = fileResult.fileID;
      
      // 转换为存储格式
      const data = document.toStorage();
      
      // 调用云函数创建文档记录
      const result = await cloudHelper.callCloudSumbit('document/create', {
        document: data
      });
      
      // 清除列表缓存
      documentCache.removeByPattern(`^project:${document.projectId}:list:`);
      
      return result;
    } catch (err) {
      console.error('[DocumentRepository] uploadDocument 错误:', err);
      throw err;
    }
  }
  
  /**
   * 更新文档信息
   * @param {DocumentModel} document 文档模型
   */
  async updateDocument(document) {
    try {
      if (!document._id) throw new Error('更新文档时ID不能为空');
      
      // 验证文档数据
      const validation = document.validate();
      if (!validation.valid) {
        throw new Error('文档数据验证失败: ' + JSON.stringify(validation.errors));
      }
      
      // 转换为存储格式
      const data = document.toStorage();
      
      // 调用云函数
      const result = await cloudHelper.callCloudSumbit('document/edit', {
        id: document._id,
        data: data
      });
      
      // 清除相关缓存
      documentCache.removeByPattern(`^detail:${document._id}`);
      documentCache.removeByPattern(`^project:${document.projectId}:list:`);
      
      return result;
    } catch (err) {
      console.error('[DocumentRepository] updateDocument 错误:', err);
      throw err;
    }
  }
  
  /**
   * 删除文档
   * @param {String} id 文档ID
   * @param {String} fileId 文件ID
   * @param {String} projectId 项目ID
   */
  async deleteDocument(id, fileId, projectId) {
    try {
      if (!id) throw new Error('文档ID不能为空');
      if (!fileId) throw new Error('文件ID不能为空');
      if (!projectId) throw new Error('项目ID不能为空');
      
      // 调用云函数删除文档记录
      const result = await cloudHelper.callCloudSumbit('document/delete', {
        id: id,
        fileId: fileId
      });
      
      // 清除相关缓存
      documentCache.removeByPattern(`^detail:${id}`);
      documentCache.removeByPattern(`^project:${projectId}:list:`);
      
      return result;
    } catch (err) {
      console.error('[DocumentRepository] deleteDocument 错误:', err);
      throw err;
    }
  }
}

export default new DocumentRepository(); 